/**
 *
 * 版权所有 © cybersky.com
 *
 */
package cn.cybertron.primus.report.entity;

import java.io.Serializable;
import java.util.Vector;

import org.nutz.dao.entity.annotation.Column;
import org.nutz.dao.entity.annotation.Name;
import org.nutz.dao.entity.annotation.Table;
import org.nutz.json.JsonIgnore;

import cn.cybertron.primus.report.data.ZReportItem;
import cn.cybertron.primus.utils.SerializeUtil;

/**
 * 报表中间表类
 * @author: ch
 */
@Table("report_cache")
public class ReportCache implements Serializable {

	private static final long serialVersionUID = -2889068706985570484L;

	public static final SerializeUtil serializer = SerializeUtil.getInstance(Vector.class);
	
	/**
	 * 中间表类型
	 */
	public static enum CacheType {
		/** 可供终端用户使用的中间表 */ source, /** 只限其他中间表使用的中间表 */ cache
	}
	
	/**
	 * 报表UUID,用来查找报表对应中间表
	 */
	@Name
	@Column
	protected String uuid;

	/**
	 * 中间表数据所属模块
	 *  根据所属模块获取字段信息
	 */
	@Column
	protected String module;

	/**
	 * 中间表标题
	 */
	@Column
	protected String title;

	/**
	 * 中间表描述
	 */
	@Column
	protected String description;
	
	/**
	 * 中间表类型
	 */
	@Column
	protected CacheType type = CacheType.source;

	/**
	 * 统计字段
	 */
	@Column
	@JsonIgnore // 转json 时忽略
	protected String statixml;
	
	protected Vector<ZReportItem> statiitems = new Vector<ZReportItem>();
	
	/**
	 * 分组字段
	 */
	@Column
	@JsonIgnore // 转json 时忽略
	protected String groupxml;
	
	protected Vector<ZReportItem> groupitems = new Vector<ZReportItem>();

	/**
	 * 因为目前系统不存在SQL转FilterExpression的接口，
	 * 如果硬编码实现，不确定条件过多，
	 * 故添加该字段用来保存于filter字段相对应的filterExpression过滤条件
	 * 目前仅用于中间表管理部分：初始化中间表过滤器时，jsp页面使用。
	 * 暂时没想到更好的储存方式，故暂在cache对象中存储。
	 */
	@Column
	protected String expression;

	/**
	 * 中间表统计时间间隔:单位为分钟
	 */
	@Column
	protected int intervalTime;

	/**
	 * 中间表数据存放时间:单位为天
	 */
	@Column
	protected int storageTime = 0;

	/**
	 * 是否为预定义（内置）中间表，只读
	 * true：内置中间表，只读；false：自定义中间表，读写
	 */
	@Column
	protected boolean system = false;
	
	/**
	 * 是否启用：中间表是否写入数据
	 */
	@Column
	protected boolean enable = true;

	/**
	 * 中间表是否启动
	 */
	protected boolean start = false;

	public ReportCache() {

	}

	/**
	 * 获取中间表名称
	 * @return
	 */
	public String getName(){
		return "report_cache_"+uuid.replace("-", "");
	}
	
	public String getUuid() {
		return uuid;
	}

	public void setUuid(String uuid) {
		this.uuid = uuid;
	}

	public String getModule() {
		return module;
	}

	public void setModule(String module) {
		this.module = module;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public CacheType getType() {
		return type;
	}

	public void setType(CacheType type) {
		this.type = type;
	}

	public String getStatixml() {
		if(statiitems != null && statiitems.size() > 0)
			this.statixml = serializer.toXml(statiitems);
		return this.statixml;
	}

	@SuppressWarnings("unchecked")
	public void setStatixml(String statixml) {
		if(statixml != null){
			this.statiitems = (Vector<ZReportItem>) serializer.fromXml(statixml);
		}
		//this.statixml = statixml;
	}

	public Vector<ZReportItem> getStatiitems() {
		return statiitems;
	}

	public void setStatiitems(Vector<ZReportItem> statiitems) {
		this.statiitems = statiitems;
	}

	public String getGroupxml() {
		if(groupitems != null && groupitems.size() > 0)
			this.groupxml = serializer.toXml(groupitems);
		return groupxml;
	}

	@SuppressWarnings("unchecked")
	public void setGroupxml(String groupxml) {
		if(groupxml != null){
			this.groupitems = (Vector<ZReportItem>) serializer.fromXml(groupxml);
		}
		//this.groupxml = groupxml;
	}

	public Vector<ZReportItem> getGroupitems() {
		return groupitems;
	}

	public void setGroupitems(Vector<ZReportItem> groupitems) {
		this.groupitems = groupitems;
	}

	public String getExpression() {
		return expression;
	}

	public void setExpression(String expression) {
		this.expression = expression;
	}

	public int getIntervalTime() {
		return intervalTime;
	}

	public void setIntervalTime(int intervalTime) {
		this.intervalTime = intervalTime;
	}

	public int getStorageTime() {
		return storageTime;
	}

	public void setStorageTime(int storageTime) {
		this.storageTime = storageTime;
	}

	public boolean isSystem() {
		return system;
	}

	public void setSystem(boolean system) {
		this.system = system;
	}

	public boolean isEnable() {
		return enable;
	}

	public void setEnable(boolean enable) {
		this.enable = enable;
	}

	public boolean isStart() {
		return start;
	}

	public void setStart(boolean start) {
		this.start = start;
	}

}
